#include "DatoCuba.h"
#include "Clave.h"
#include "EstrategiaHashSHA1.h"
#include "funciones.h"

namespace Toolkit
{

DatoCuba::DatoCuba(unsigned long int posicionBloque, const Clave &clave,
        const TipoSerializacion &tSerializacion)
{
    this->posicionBloque = posicionBloque;
    this->tSerializacion = tSerializacion;

    stringstream claveSerializada;
    clave.serializar(claveSerializada);
    string claveAHashear = claveSerializada.str();

    EstrategiaHashSHA1 estrategiaHashMod;
    string claveHasheadaAux = estrategiaHashMod.hash(claveAHashear);

    this->claveHasheada = claveHasheadaAux;
}

DatoCuba::DatoCuba(unsigned long int posicionBloque, string claveHasheada,
        const TipoSerializacion &tSerializacion)
{
    this->posicionBloque = posicionBloque;
    this->claveHasheada = claveHasheada;
    this->tSerializacion = tSerializacion;
}

DatoCuba::~DatoCuba()
{
}

void DatoCuba::serializar(stringstream& stream) const
{
    stream.write(claveHasheada.c_str(), claveHasheada.size());
    agregarTamanoASerializacionComp(stream, tSerializacion);

    serializacionDigito(stream, tSerializacion, posicionBloque);
}

void DatoCuba::hidratar(stringstream& stream)
{
    int longitudString = 0;

    hidratacionDigito(stream, tSerializacion, longitudString);

    char *buffer = new char[longitudString];
    stream.read(buffer, longitudString);

    this->claveHasheada = "";
    this->claveHasheada.append(buffer, longitudString);

    delete []buffer;

    hidratacionDigito(stream, tSerializacion, posicionBloque);
}

unsigned long int DatoCuba::getPosicionBloque() const
{
    return posicionBloque;
}

string DatoCuba::getClaveHasheada() const
{
    return claveHasheada;
}

Dato* DatoCuba::clonar() const
{
    return new DatoCuba(this->posicionBloque, this->claveHasheada,
            this->tSerializacion);
}

}

